﻿#pragma once

#include "MaterialGraph/Node/MaterialGraphNodeModel.h"
#include "MaterialOperationNodeModel.m.h"

RENUM()
enum class EMaterialOperationType 
{
    //function
    Add,                    //两个输入
    Subtract,               //两个输入
    Multiply,               //两个输入
    Divide,                 //两个输入
    AddAfterMultiply,       //三个输入

    Logarithm,              //对数，两个输入
    SquareRoot,             //开方，一个输入
    Inverse,                //倒数，一个输入
    InverseSquareRoot,      //平方根倒数(1/sqrt(x))，一个输入
    Absolute,               // 绝对值，一个输入
    Power,                  // 幂(x^y)，两个输入

    //compare
    Min,                    //最小值，两个输入
    Max,                    //最大值，两个输入
    Greater,                // >, 两个输入
    Less,                   // <, 两个输入
    Sign,                   //sign, -1,0,1, 一个输入
    Equal,                  // == ,有容差，三个输入

    //smooth min function : https://iquilezles.org/www/articles/smin/smin.htm
    //there is lots of smooth min/max function, choose sqrt version
    // float smin( float a, float b, float k )
    // {
    //     k *= 2.0;
    //     float x = b-a;
    //     return 0.5*( a+b-sqrt(x*x+k*k) );
    // }
    SmoothMin,  //平滑最小值，三个输入
    // float smax( float a, float b, float k )
    // {
    //     k *= 2.0;
    //     float x = b-a;
    //     return 0.5*( a+b+sqrt(x*x+k*k) );
    // }
    SmoothMax,   //平滑最大值，三个输入

    //round
    Floor,        //向下取整，一个输入
    Ceil,         //向上取整，一个输入
    Round,        //四舍五入，一个输入
    Integer,      //整数部分，一个输入
    Fraction,     //小数部分，一个输入

    Snap,           //吸附到网格，snap(x,grid) = round(x/grid) * grid
                    //两个输入
    Loop,           //循环, loop(x,Min,Max) = x - floor((x-Min)/(Max-Min)) * (Max-Min)
                    //三个输入


    //trigonometric
    Sin,            //正弦，一个输入
    Cos,            //余弦，一个输入
    Tan,            //正切，一个输入
    Asin,           //反正弦，一个输入
    Acos,           //反余弦，一个输入
    Atan,           //反正切，一个输入
    Atan2,          //反正切，两个输入

    Sinh,           //双曲线正弦 , sinh(x) = (e^x - e^-x) / 2   ，一个输入
    Cosh,           //双曲线余弦, cosh(x) = (e^x + e^-x) / 2    ，一个输入
    Tanh,           //双曲线正切, tanh(x) = sinh(x) / cosh(x)   ，一个输入

    //convert
    ToRadians,      //角度转弧度，一个输入
    ToDegrees,      //弧度转角度，一个输入
};

RCLASS(ExtraHeader="MaterialGraph/Pin/MaterialGraphPinModel.h")
class RMaterialOperationNodeModel : public RMaterialGraphNodeModel
{
    ROBJECT

public:
    virtual void FirstTimeInitializeObject() override;

    virtual CString GenerateExpression() override;

    //clamp the result to [0,1]
    RFIELD()
    bool bClamp=false; 

    EMaterialOperationType GetOperationType() const
    {
        return OperationType;
    }

    void SetOperationType(EMaterialOperationType InOperationType)
    {
        OperationType = InOperationType;
        UpdatePin();
    }

    int64_t GetValidInputNum() const
    {
        return ValidInputNum;
    }
protected:
    void UpdatePin();

    RFIELD()
    EMaterialOperationType OperationType;

    int64_t ValidInputNum=3;
};